<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>连续整数之和</title>
</head>
<body>
	<script>
	/**
	 * 解题思路
	 * 比如sum = 15
	 * 依次从[1,2,3,4,5,6,7,8,,9,10,11,12,13,14,15]取符合连续的值
	 * 取值 [1,2,3,4,5] = 15 然后进行下一组
	 * 继续取值 [1,2,3,4,5,6] 结果21 > 15，然后就移除 1，2，3，更新后的数组是[4,5,6] = 15
	 * 继续取值 [4,5,6,7] 结果 22 > 15，很明显 移除 4，5，更新后的数组是[6，7] = 13
	 * 继续取值 [6,7,8] 结果 21 > 15，很明显 移除 6，更新后的数组是[7，8] = 15
	 * 大概就是这么一个流程，知道遍历到15，因为 15 > sum
	 *
	 * 1）创建一个容器 child，用于表示当前的子序列，初始元素为 1,2
	 * 2）记录子序列的开头元素 small 和末尾元素 big
	 * 3）big 向右移动子序列末尾增加一个数；small 向右移动子序列开头减少一个数
	 * 4）当子序列的和大于目标值，small 向右移动，子序列的和小于目标值，big 向右移动
	 */
	
	function FindContinuousSequence(sum) {
	  let result = [];
	  // 记录当前的结果
	  let child = [1, 2];
	  let small = 1; // 初始值1
	  let big = 2; //
	  let currentSum = 3; // 当前数字之和
	  while (big < sum) {
	    // big等于sum时，child中只剩一个数，不满足连续正数序列的要求，结束循环
	    while (currentSum < sum && big < sum) {
	      child.push(++big);
	      // currentSum为当前child的和
	      currentSum += big;
	    }
	    while (currentSum > sum && small < big) {
	      child.shift();
	      // 因为删除了最小值，所以small也要响应变化，增加1
	      currentSum -= small++;
	    }
	    if (currentSum === sum && child.length > 1) {
	      // child.length大于1，剔除一个数等于sum的情况
	      // child.slice返回一个新的数组
	      result.push(child.slice());
	      child.push(++big);
	      currentSum += big;
	    }
	  }
	  return result;
	}

	console.log(FindContinuousSequence(15)); // [1, 2, 3, 4, 5] [4, 5, 6] [7, 8]
	</script>
	
</body>
</html>